﻿using System;
using System.Linq;
using AutomaticScrewLocking.domain.modbus.comm.model.valobj;

namespace AutomaticScrewLocking.domain.modbus.comm
{
    public class DisplayData
    {
        public static byte[] ConvertData(byte[] bytes,DataFormat dataFormat,bool isLittleEndian)
        {
            // 确保输入字节数组长度为4（float类型的字节数）
            if (bytes.Length != 4)
                throw new ArgumentException("输入字节数组必须包含4个元素", nameof(bytes));

            byte[] newBytes = new byte[4];

            // 决策树第一层：判断数据格式类型
            if (dataFormat == DataFormat.FLOAT_ABCD || dataFormat == DataFormat.FLOAT_DCBA)
            {
                // 处理正序格式（ABCD或DCBA）
                HandleNormalOrder(bytes, newBytes, dataFormat, isLittleEndian);
            }
            else
            {
                // 处理反序格式（BADC或CDAB）
                HandleReverseOrder(bytes, newBytes, dataFormat, isLittleEndian);
            }

            return newBytes;
        }

        // 处理正序格式（ABCD/DCBA）的决策分支
        private static void HandleNormalOrder(byte[] source, byte[] target, DataFormat dataFormat, bool isLittleEndian)
        {
            // 决策树第二层：判断是否需要反转字节
            bool needReverse = (dataFormat == DataFormat.FLOAT_ABCD && isLittleEndian) ||
                (dataFormat == DataFormat.FLOAT_DCBA && !isLittleEndian);
            
            // 将字节数组进行反转
            if (needReverse)
            {
                source.Reverse().ToArray().CopyTo(target, 0);
            }
            else
            {
                source.CopyTo(target, 0);
            }
        }

        // 处理反序格式（BADC/CDAB）的决策分支
        private static void HandleReverseOrder(byte[] source, byte[] target, DataFormat dataFormat, bool isLittleEndian)
        {
            // 决策树第二层：判断是否需要先整体反转
            byte[] processedBytes = (dataFormat == DataFormat.FLOAT_BADC && !isLittleEndian) ||
                                   (dataFormat == DataFormat.FLOAT_CDAB && isLittleEndian)
                ? (byte[])source.Clone()
                : source.Reverse().ToArray();

            // 决策树第三层：执行两两交换
            target[0] = processedBytes[1];
            target[1] = processedBytes[0];
            target[2] = processedBytes[3];
            target[3] = processedBytes[2];
        }
    }
}
